#ifndef _LAYER_H_
#define _LAYER_H_

#include <map>
#include <string>

#include "MapCase.h"
#include "Tile.h"

/**
  * @brief Coordonnees sur une carte
  *
  * Couple (x,y)
  */
typedef std::pair<int,int> Coord ;

/**
  * @class Layer
  * @brief Calque d'une carte TMX
  */
class Layer {
private :
    std::map<Coord, MapCase> _cases ;
	int _width ;
	int _height ;
	char* _name ;
	bool _visible ;
	float _opacity ; 
public :
    /**
      * @brief Constructeur
      *
      * Cree un calque vide
      */
    Layer() ;
    /**
      * @brief Ajoute une case au calque
      *
      * @param coord : Coordonnees de la case
      * @param m : Case à ajouter
      */
    void addCase(Coord& coord, MapCase m) ;
    /**
      * @brief Ajoute une case au calque
      *
      * @param x : abscisse de la case
      * @param y : ordonnee de la case
      * @param m : Case à ajouter
      */
    void addCase(int x, int y, MapCase m) ;
    /**
      * @brief Ressource associee a une case du calque
      *
      * @param coord : Coordonnees de la case
      *
      * @return Un pointeur sur la ressource associee, NULL si aucune ressource
      */
    const Tile* tile(Coord& coord) const ;
    /**
      * @brief Ressource associee a une case du calque
      *
      * @param x : abscisse de la case
      * @param y : ordonnee de la case
      *
      * @return Un pointeur sur la ressource associee, NULL si aucune ressource
      */
    const Tile* tile(int x, int y) const ;
    /**
      * @brief Nombre de cases sur le calque
      *
      * @return Le nombre de cases
      */
    int count() const  ;
    /**
      * @brief Largeur du layer, en nombre de cases
      *
      * @return La largeur du layer
      */
	int width() const ;
    /**
      * @brief Hauteur du layer, en nombre de cases
      *
      * @return La hauteur du layer
      */
	int height() const ;
    /**
      * @brief Opacite du calque
      *
      * @return L'opacite du calque. 0 veut dire transparent, 1 pleinement visible.
      */
	float opacity() const ;
    /**
      * @brief Nom du calque
      *
      * @return le nom du claque
      */
	const std::string name() const ;
    /**
      * @brief Le calque est-il visible
      *
      * @return Vrai si le calque est visible, faux sinon
      */
	bool visible() const ;
    /**
      * @brief Modifie l'opacite du calque
      *
      * @param opacity : Nouvelle opacité
      */
    void setOpacity(float opacity) ;
    /**
      * @brief Modifie le nom du calque
      *
      * @param name : Le nouveau nom du calque
      */
    void setName(const char* name) ;
    /**
      * @brief Modifie la visibilite du calque
      *
      * @param visible : La nouvelle visibilité
      */
    void setVisible(bool visible) ;
};

#endif // _LAYER_H_
